#pragma once
#include "SLDST_OP_enum.h"
#include"../../execution_module/write_delay_control/write_delay_control.h"
#include "../../instruction_module/instruction.h"
#include "../LDST_mode_enum.h"
#include <iostream>

class SLDST {
    public:
        SLDST(memory* sm, WriteControlModule* wcm, RegisterFile* rf) : SM(sm), WCM(wcm), RF(rf) {
    
        }
        ~SLDST() {}
        void Execute(instruction* vldst_instr);
        inline uint64_t read_Reg(int reg_id);
        //op代表寻址计算的方式以及基址寄存器的操作，size代表访存粒度并决定地址的对齐粒度
        addr_size_t calculate_mem_addr(int AR_reg_id, int OR_reg_id, int8_t op, int size);
        addr_size_t calculate_mem_addr(int AR_reg_id, uint64_t imm, int8_t op, int size);
        void do_SLDH(addr_size_t addr, int dst_reg_id);
        void do_SLDHU(addr_size_t addr, int dst_reg_id);
        void do_SSTH(addr_size_t addr, int src_reg_id);
        void do_SLDW(addr_size_t addr, int dst_reg_id);
        void do_SSTW(addr_size_t addr, int src_reg_id);
        void do_SLDDW(addr_size_t addr, int dst_reg_id);
        void do_SSTDW(addr_size_t addr, int src_reg_id);
        void do_SLDB(addr_size_t addr, int dst_reg_id);
        void do_SLDBU(addr_size_t addr, int dst_reg_id);
        void do_SLDDB(addr_size_t addr, int dst_reg_id);
        void do_SLDDBU(addr_size_t addr, int dst_reg_id);
        void do_SSTB(addr_size_t addr, int src_reg_id);
        void do_SSTDB(addr_size_t addr, int src_reg_id);

    protected:
        memory* SM;
        WriteControlModule* WCM;
        RegisterFile* RF;
    
    };